package Servidor;

import Cliente.Cliente;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Douglas
 */
public class ThreadAtendeCli extends Thread {

    Socket conexao;
    ArrayList<User> usuarios;

    public ThreadAtendeCli(Socket conexao, ArrayList<User> usuarios) {
        this.conexao = conexao;
        this.usuarios = usuarios;
    }

    @Override
    public void run() {

        while (true) {
            String mensagem;
            try {
                BufferedReader in = new BufferedReader(new InputStreamReader(conexao.getInputStream()));
                DataOutputStream out = new DataOutputStream(conexao.getOutputStream());

                mensagem = in.readLine();


                System.out.println("RECEBEU--->" + mensagem);
                System.out.println("pos 1>>" + mensagem.split(":")[1]);


                switch (mensagem.split(":")[1]) {
                    case "LOG":

                        User user = Servidor.getServer().consultarUsuario(mensagem.split(":")[2], mensagem.split(":")[3]);
                        if (user != null) {
                            out.writeBytes("FLOG\n");
                            user.setOnline(true);
                            System.out.println("LOGIN REALIZADO");
                        } else {
                            out.writeBytes("NLOG\n");
                            System.out.println("LOGIN E/OU SENHA INCORRETOS");
                        }

                        break;

                    case "CAD":
                        if (Servidor.getServer().consultarUsuario(mensagem.split(":")[2])) {
                            out.writeBytes("JCAD\n");
                            System.out.println("USUARIO JÁ CADASTRADO");
                        } else {
                            usuarios.add(new User(mensagem.split(":")[2], mensagem.split(":")[3]));
                            System.out.println("USER CADASTRADO>>" + usuarios.get(usuarios.size() - 1).getLogin() + ":" + usuarios.get(usuarios.size() - 1).getSenha());

                            Servidor.getServer().SalvaLogins(usuarios.get(usuarios.size() - 1));
                            out.writeBytes("FCAD\n");
                        }

                        break;

                    case "ARQ":

                        out.writeBytes("GO\n");

                        ObjectInputStream inputArc = new ObjectInputStream(new BufferedInputStream(conexao.getInputStream()));
                        String fileName = inputArc.readUTF();
                        long size = inputArc.readLong();

                        System.out.println("Processando arquivo: " + fileName + " - " + size + " bytes.");
                        String path = "FTP" + File.separator + "arquivos" + File.separator + fileName;
                        BufferedOutputStream saveArq = new BufferedOutputStream(new FileOutputStream(path));
                        byte[] buf = new byte[4096];
                        int temp = 0;
                        while (true) {
                            int len;
                            if (size - temp > 0) {
                                len = inputArc.read(buf);
                            } else {
                                saveArq.close();
                                break;
                            }
                            temp = temp + len;
                            System.out.println("Quanto ja veio-->" + temp + "//" + size);


                            saveArq.write(buf, 0, len);
                            saveArq.flush();
                        }
                        path = path + ".users";
                        BufferedWriter bw = new BufferedWriter(new FileWriter(path));
                        bw.write("kiko.ecomp@gmail.com");
                        bw.close();
                        path = "FTP" + File.separator + "users" + File.separator + "kiko.ecomp@gmail.com";
                        if (GerenciadorArquivo.arquivoExiste(path)) {
                            bw = new BufferedWriter(new FileWriter(path, true));
                            bw.write("\n" + fileName);
                        } else {
                            bw = new BufferedWriter(new FileWriter(path));
                            bw.write(fileName);
                        }
                        bw.close();
                        System.out.println(fileName);
                        System.out.println("Arquivo enviado com sucesso");
                        //inputArc.close();
                        //saveArq.close();
                        break;
                        
                    case "LST":
                        out.writeBytes("GO\n");
           
                        String email = in.readLine();
                        System.out.println("Servidor recebeu email");

                        try {
                            path = "FTP" + File.separator + "users" + File.separator + email;
                            File file = new File(path);
                            ObjectOutputStream sai = new ObjectOutputStream(new BufferedOutputStream(conexao.getOutputStream()));
                            System.out.println("Enviando para cliente: " + file.getName());
                            sai.writeUTF(file.getName());
                            sai.writeLong(file.length());
                            BufferedInputStream entra = new BufferedInputStream(new FileInputStream(file));
                            
                            byte[] buffer = new byte[4096];
                            while (true) {
                                int len = entra.read(buffer);
                                if (len == -1) {
                                    break;
                                }
                                sai.write(buffer, 0, len);
                                sai.flush();
                            }

                            System.out.println("Arquivo enviado com sucesso");
                            //sai.close();
                            //entra.close();

                        } catch (IOException ex) {
                            
                        }
                        break;
                    case "SHARE":
                        out.writeBytes("GO\n");
                        email = in.readLine();
                        System.out.println("Servidor recebeu email");
                        fileName = in.readLine();
                        System.out.println("Servidor recebeu nome do arquivo");
                        
                        if (GerenciadorArquivo.nomeEncontrado(fileName, email)) {
                            out.writeBytes("Este arquivo já está sendo compartilhado com este usuário\n");
                            return;
                        }
                        try {
                            BufferedWriter mout = new BufferedWriter(new FileWriter("FTP" + File.separator + "arquivos" + File.separator + fileName + ".users", true));
                            if (GerenciadorArquivo.arquivoExiste("FTP" + File.separator + "arquivos" + File.separator + fileName + ".users")) {
                                mout.write("\n" + email);
                                System.out.println("Escreveu no na lista de usuários do arquivo");
                            } else {
                                mout.write(email);
                            }
                            mout.close();
                            mout = new BufferedWriter(new FileWriter("FTP" + File.separator + "users" + File.separator + email));
                            if (GerenciadorArquivo.arquivoExiste("FTP" + File.separator + "users" + File.separator + email)) {
                                mout.write("\n" + fileName);
                            } else {
                                mout.write(fileName);
                            }
                            mout.close();
                            out.writeBytes("O arquivo foi compartilhado com " + email + "\n");
                            String t = "Um arquivo foi compartilhado com você"
                                    + "Faça login através do aplicativo CloudFlying para ter acesso ao arquivo";
                            try {
                                Servidor.SendEmail("Novo arquivo compartilhado", t, email);
                            } catch(Exception e) {
                                e.printStackTrace();
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    case "DOWN":
                        out.writeBytes("GO\n");
                        fileName = in.readLine();
                        System.out.println("Servidor recebeu nome do arquivo que será baixado");
                        try {
                            path = "FTP" + File.separator + "arquivos" + File.separator + fileName;
                            File file = new File(path);
                            ObjectOutputStream sai = new ObjectOutputStream(new BufferedOutputStream(conexao.getOutputStream()));
                            System.out.println("Enviando para cliente: " + file.getName());
                            sai.writeUTF(file.getName());
                            sai.writeLong(file.length());
                            BufferedInputStream entra = new BufferedInputStream(new FileInputStream(file));
                            
                            byte[] buffer = new byte[4096];
                            while (true) {
                                int len = entra.read(buffer);
                                if (len == -1) {
                                    break;
                                }
                                sai.write(buffer, 0, len);
                                sai.flush();
                            }

                            System.out.println("Arquivo enviado com sucesso");
                            //sai.close();
                            //entra.close();

                        } catch (IOException ex) {
                            System.out.println("Ocorreu um erro ao enviar arquivo para o usuário");
                        }
                        break;
                }

                
                    out.flush();
                    //out.close();
                    //in.close();
                } catch (FileNotFoundException ex) {
                    Logger.getLogger(ThreadAtendeCli.class.getName()).log(Level.SEVERE, null, ex);
                } catch (SocketException ex) {
                    System.out.println("PAROU O WHILE DA THREAD");
                    break;
                } catch (IOException ex) {
                    Logger.getLogger(ThreadAtendeCli.class.getName()).log(Level.SEVERE, null, ex);
                } 
        }


    }
}
